Gradle快速构建(二)gradle构建NDK编译环境 |
您所在的位置:网站首页 › ndk 编译器 › Gradle快速构建(二)gradle构建NDK编译环境 |
在我的文章如何使用AndroidStudio-Cmake中有说过在gradle配置jni环境,本章主要更加细致的介绍如何配置一些自定义的选项,比如选择ndk版本编译,编译不同的库,cmake编译下配置引用不同的C++ libd等。 文章目录 一 mk编译下自定义ndk编译指令1. 获取NDK路径2. 执行ndk编译指令3. 指定静态库的引用路径 二 cmake编译选项配置1.配置AS编译方式2.配置C++编译参数3.JNI分包打包配置 具体的一些语法请参照我的Groovy语法学习两章 一 mk编译下自定义ndk编译指令在发布我们的lib库时,想给别人,但是可能考虑到人家没有配置ndk全局环境变量怎么办,我们可以通过从local.properties中获取,当前AS NDK的配置路径,去手动指定ndk编译器编译j’ni库,当然,这是基于Android.mk编译jni的情况下 注意配置NDK许可,这个在新版本被去除了,改成了通过externalNativeBuild 声明,老版本是在gradle.properties添加: android.useDeprecatedNdk=true 1. 获取NDK路径在gradle根目录下添加 String getNdkBuildPath() { Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) def ndkBuildingDir = properties.getProperty("ndk.dir") def ndkBuildPath = ndkBuildingDir if (Os.isFamily(Os.FAMILY_WINDOWS)) {//需要判断系统版本 ndkBuildPath = ndkBuildingDir + '/ndk-build.cmd' } else { ndkBuildPath = ndkBuildingDir + '/ndk-build' } return ndkBuildPath } 2. 执行ndk编译指令 task ndkBuild(type: Exec, description: 'Compile JNI source') { println('executing ndkBuild') def ndkBuildPath = getNdkBuildPath(); commandLine ndkBuildPath, '-j8', '-C', file('src/main').absolutePath } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn ndkBuild } task ndkClean(type: Exec, description: 'clean JNI libraries') { println('executing ndkBuild clean') def ndkBuildPath = getNdkBuildPath(); commandLine ndkBuildPath, 'clean', '-C', file('src/main').absolutePath } clean.dependsOn 'ndkClean' 3. 指定静态库的引用路径通过上述任务执行编译,基于.mk的编译脚本,通过执行ndk库编译,它生成的静态库文件也位于mian/src/libs,我们知道AS的缺省引用路径在jniLibs,所以我们还需要指定.so的引用路径。以及去除AS对jni的自动编译选项 sourceSets.main { jniLibs.srcDir 'src/main/libs' jni.srcDirs = [] //disable automatic ndk-build call } 二 cmake编译选项配置cmake用起来感觉比mk脚本方便一点,在某些大型jni项目时,更具灵活性,我们在编译jni代码时,可以在CMakeLists.txt中配置几乎所有参数,当然,也可以选择将一部分配置放到gradle中配置,这样可以更直观的看到我们配置参数,并且修改起来也更加方便。 1.配置AS编译方式选择CMakeLists.txt编译方式 android { externalNativeBuild { cmake { path "CMakeLists.txt" } } }android.mk编译方式 externalNativeBuild { ndkBuild { path 'src/main/jni/Android.mk' //你的android.mk目录 path 'src/main/jni/Application.mk' //Application.mk目录 } } 2.配置C++编译参数指定一些编译宏参数和格式,指定编译的平台版本 android { defaultConfig { // This block is different from the one you use to link Gradle // to your CMake or ndk-build script. externalNativeBuild { // For ndk-build, instead use ndkBuild {} cmake { // Cmake可选参数 arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang" // 选择C编译的标记,选一个即可 cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2" // C ++宏常量格式 cppFlags "-D__STDC_FORMAT_MACROS" } } ndk { // 指定编译的ABI,选择你项目需要的abi即可 abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a' } } 3.JNI分包打包配置gradle android根目录 //分包打包,可指定不同的编译版本 productFlavors { one { externalNativeBuild { cmake { targets "native-lib-1" } } } two { externalNativeBuild { cmake { targets "native-lib-2" } } } } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |